package com.indusfo.spc.controller;

import com.indusfo.spc.mapper.UploadMapper;
import com.indusfo.spc.pojo.*;
import com.indusfo.spc.service.ProductLineService;
import com.indusfo.spc.untlis.GsonUtil;
import com.indusfo.spc.vo.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * 产线前端控制层
 *
 * @author xuz
 * @date 2018/11/30 1:37 PM
 */
@Controller
@RequestMapping("/productLine")
public class ProductLineController {

    @Autowired
    private ProductLineService productLineService;
    @Resource
    private UploadMapper uploadMapper;

    /**
     * 更新
     *
     * @author xuz
     * @date 2018/11/30 1:38 PM
     * @return com.indusfo.spc.vo.JSONObject
     */
    @RequestMapping(value="/updateProductLine", method= RequestMethod.POST)
    @ResponseBody
    public JSONObject updateProductLine(String lProductionLineId, String vcRemark, String vcProductionLineName, String vcProductionLineCode, String workshopId, String capacity) {

        JSONObject json = productLineService.updateProductLine(lProductionLineId,vcRemark,vcProductionLineName,vcProductionLineCode,workshopId,capacity);
        return json;

    }
    /**
     * 新增
     *
     * @author xuz
     * @date 2018/11/30 1:38 PM
     * @return com.indusfo.spc.vo.JSONObject
     */
    @RequestMapping(value="/insertProductLine", method= RequestMethod.POST)
    @ResponseBody
    public JSONObject insertProductLine(String vcRemark, String vcProductionLineName, String vcProductionLineCode, String workshopId, String capacity) {

        JSONObject json = productLineService.insertProductLine(vcRemark,vcProductionLineName,vcProductionLineCode,workshopId,capacity);
        return json;

    }

    /**
     * 查询
     *
     * @author xuz
     * @date 2018/11/30 1:38 PM
     * @return com.indusfo.spc.vo.JSONObject
     */
    @RequestMapping(value="/queryProductLine")
    @ResponseBody
    public JSONObject queryProductLine(Productline productLine) {

        JSONObject json = productLineService.queryProductLine(productLine);
        return json;

    }

    /**
     * 启用/停用
     *
     * @author xuz
     * @date 2018/12/21 2:52 PM
     * @return com.indusfo.spc.vo.JSONObject
     */
    @RequestMapping(value="/definesProductLine", method= RequestMethod.POST)
    @ResponseBody
    public JSONObject definesProductLine(Long[] lProductLineIds, Integer lDataState) {

        JSONObject json = productLineService.deleteProductLine(lProductLineIds, lDataState);
        return json;
    }

    /**
     * 删除
     *
     * @author xuz
     * @date 2018/11/30 1:38 PM
     * @return com.indusfo.spc.vo.JSONObject
     */
    @RequestMapping(value="/deleteProductLine", method= RequestMethod.POST)
    @ResponseBody
    public JSONObject delProductLine(Long[] lProductLineIds, Integer lDataState) {

        lDataState = 2;
        JSONObject json = productLineService.deleteProductLine(lProductLineIds, lDataState);
        return json;
    }

    @RequestMapping("/uploadFileProductLine")
    @ResponseBody
    public JSONObject uploadFileUser(@RequestParam("file") MultipartFile file, Boolean way, HttpServletRequest request, HttpServletResponse response) throws IOException, ParseException {
        //定义一个message对象用于向前台传输数据
        Message msg = new Message();
        //设置错误集合的
        List<ExcelErrorData> errorDatas = new ArrayList<>();
        response.setContentType("text/html;charset=UTF-8");
        //判断上传文件格式是否正确
        Workbook wb = ExcelUtil.getWorkbook(file.getInputStream(), ExcelUtil.isExcel2007(file.getOriginalFilename()));
        if (wb == null) {
            errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "文件解析错误"));
        } else {
            //获取excel文件的第一个sheet
            Sheet sheet = wb.getSheetAt(0);
            if (sheet == null) {
                msg.setCode(2);
                msg.setMsg("未找到需要导入的表格");
                errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "未找到需要导入的表格"));
            } else {
                //获取最后一行的行号
                int rowCount = sheet.getLastRowNum();
                if (rowCount < 1) {
                    msg.setCode(1);
                    msg.setMsg("未找到需要导入的数据，请确认表格是否保存！！！");
                    errorDatas.add(ExcelErrorData.getExcelErrorData(0, "未找到需要导入的数据，请确认表格是否保存！！！"));
                } else {
                    List<Productline> addProductPlans = new ArrayList<>();
                    for (int i = 1; i <= rowCount; i++) {
                        boolean needAdd = true;
                        //获取到每一行的每一列的数据
                        String productLineCode =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 0, false);
                        String productLineName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 1, false);
                        String workshopName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 2, false);
                        String capacityContent = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 3, false);
                        Integer capacity=null;
                        if(capacityContent!=null){
                            capacity=Integer.valueOf(capacityContent);
                        }
                        String vcRemark = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 4, false);
                        Productline plan = new Productline(productLineCode,productLineName,capacity,workshopName,vcRemark);
                        int m = i + 1;
                        //将excel中的每一行数据存储进行检查
                        String result = productLineService.checkExcelContent(plan);
                        if(result!=null){
                            errorDatas.add(ExcelErrorData.getExcelErrorData(i, result));
                            needAdd=false;
                        }
                        for (int j = 1; j < i; j++) {
                            //判断用户编码是否重复
                            String oldProductLineCode =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, j, 0, false);
                            String oldProductLineName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, j, 1, false);
                            if (StringUtils.isBlank(productLineCode) && oldProductLineCode.equals(productLineCode)) {
                                needAdd = false;
                                errorDatas.add( ExcelErrorData.getExcelErrorData(i, "与表格中第" + j + "行存在相同产线编码"));
                            }
                            if (StringUtils.isBlank(productLineName) && oldProductLineName.equals(productLineName)) {
                                needAdd = false;
                                errorDatas.add( ExcelErrorData.getExcelErrorData(i, "与表格中第" + j + "行存在相同产线名称"));
                            }
                        }
                        if (needAdd) {
                            addProductPlans.add(plan);
                        } else {
                            msg.setCode(2);
                            msg.setMsg("导入数据中存在异常信息");
                        }

                    }
                    //根据这些来判断是否是中止导入还是跳过继续进行导入
                    if (msg.getCode() == 2 && !way) {
                        msg.setMsg(msg.getMsg() + ",中止导入");
                    } else {
                        if (addProductPlans.size() > 0) {
                            try {
                                uploadMapper.updateListProductLine(addProductPlans);
                                //当程序执行到这里时,判断信息是否为空为空的话设置导入成功
                                msg.setMsg(StringUtils.isBlank(msg.getMsg()) ? "导入成功" : msg.getMsg());
                                if ("导入成功".equals(msg.getMsg())) {
                                    msg.setCode(1);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                msg.setMsg("导入失败");
                            }
                        }
                    }

                }
            }
        }
        msg.setData(GsonUtil.toJson(errorDatas));
        return JSONObject.build(200,msg.getMsg(),errorDatas);
    }
}
